"""
样条差值函数的使用
"""
import numpy as np
import scipy.interpolate as spi

import matplotlib.pyplot as plt


def _cubic_spline(data):
    # 得到原始数据长度
    data_length = len(data)
    # 创建空值下标数组
    none_array = []
    # 创建需要处理的y轴数据
    y_data = []
    #  X轴数据
    x_data = []
    # 记录需要插值的数组下标，并去掉控值
    for data_index in range(0, len(data)):
        if data[data_index] is None:
            # 记录空值下标把是空值的数据添加进空值下标数组
            none_array.append(data_index)
        else:
            # 去掉none值的Y数据
            x_data.append(data_index)
            y_data.append(data[data_index])
    # 三个参数 起点为1，终点为数组长度，点数据所以步长为1，曲线数据步长为0.1
    # 定义X轴点数据
    x_point = np.arange(0, data_length, 1)
    # 定义曲线x点
    x_line = np.arange(0, data_length, 0.1)

    # 生成三次样条拟合点
    # 根据观测点和样条参数，生成插值
    x_point_r = spi.splrep(x_data, y_data)
    y_point_r = spi.splev(x_point, x_point_r)
    # 进行三次样条拟合曲线
    y_line_r = spi.splev(x_line, x_point_r)
    # 作图
    plt.scatter(x_point, y_point_r)
    plt.plot(x_line, y_line_r, label='data_line')
    plt.xlabel('time day')
    plt.ylabel('procalcitonin')
    plt.title('procalcitonin')
    plt.legend()  # 显示标签
    plt.show()
    for item in none_array:
        data[item] = round(y_point_r[item], 2)
    return data


if __name__ == '__main__':
    # 降钙素原数据
    procalcitonin = [0.5, 1.19, None, 0.71, None, 57.5]
    print(procalcitonin)
    print("处理后数据:")
    print(_cubic_spline(procalcitonin))
